package com.minimalist.tc.mapper;

import com.minimalist.common.entity.tc.entity.po.TcPlateNumber;
import com.minimalist.common.entity.tc.entity.vo.plateNumber.TcPlateNumberQueryVO;
import com.mybatisflex.core.BaseMapper;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;

import java.util.List;

/**
 * 停车车牌表 映射层。
 *
 * @author 11987
 * @since 2025-04-07
 */
public interface TcPlateNumberMapper extends BaseMapper<TcPlateNumber>{

    /**
     * 根据车牌名称查询车牌信息。
     *
     * @param plateNumberName 车牌名称
     * @return 车牌信息
     */
    default TcPlateNumber selectPlateNumberByPlateNumberName(String plateNumberName){
        return selectOneByQuery(QueryWrapper.create()
                .eq(TcPlateNumber::getPlateNumberName, plateNumberName));
    }

    /**
     * 根据车牌ID查询车牌信息。
     *
     * @param plateNumberId 车牌ID
     * @return 车牌信息
     */
    default TcPlateNumber selectPlateNumberByPlateNumberId(Long plateNumberId){
        return selectOneByQuery(QueryWrapper.create()
                .eq(TcPlateNumber::getPlateNumberId, plateNumberId));
    }

    /**
     * 根据车牌ID删除车牌信息。
     *
     * @param plateNumberId 车牌ID
     */
    default void deletePlateNumberByPlateNumberId(Long plateNumberId){
        deleteByQuery(QueryWrapper.create()
                .eq(TcPlateNumber::getPlateNumberId, plateNumberId));
    }

    /**
     * 根据车牌ID修改车牌信息。
     *
     * @param plateNumber 车牌信息
     */
    default void updatePlateNumberByPlateNumberId(TcPlateNumber plateNumber){
        updateByQuery(plateNumber, QueryWrapper.create()
                .eq(TcPlateNumber::getPlateNumberId, plateNumber.getPlateNumberId()));
    }

    /**
     * 分页查询车牌信息。
     *
     * @param queryVO 查询条件
     * @return 分页查询结果
     */
    default Page<TcPlateNumber> selectPagePlateNumberList(TcPlateNumberQueryVO queryVO){
        return paginate(queryVO.getPageNum(), queryVO.getPageSize()
                , QueryWrapper.create().like(TcPlateNumberQueryVO::getPlateNumberName
                                , queryVO.getPlateNumberName())
                        .like(TcPlateNumberQueryVO::getVehicleModel
                                , queryVO.getVehicleModel()));
    }

    /**
     * 查询未识别的车牌信息。
     *
     * @param count 查询数量
     * @return 未识别的车牌信息
     */
    default List<TcPlateNumber> selectNotRecognizePlateNumbers(Integer count){
        return selectListByQuery(QueryWrapper.create()
                .isNull(TcPlateNumber::getIdentifyResult)
                .orderBy(TcPlateNumber::getPlateNumberId, true)
                .limit(count));
    }

    /**
     * 查询未识别的车牌信息。
     *
     * @param count 查询数量
     * @return 未识别的车牌信息
     */
    default List<TcPlateNumber> selectNotRecognizePlateNumbersWithFileId(Integer count){
        return selectListByQuery(QueryWrapper.create()
                .isNotNull(TcPlateNumber::getFileId, true)
                .isNull(TcPlateNumber::getIdentifyResult));
    }
}
